package typedvalue

// TypedValue typed value interface
type TypedValue interface {
	Type() Type
	Value() interface{}
	ToUint64() (uint64, error)
	ToInt64() (int64, error)
}

// ToTypedValue convert some go value to TypedValue
func ToTypedValue(value interface{}) TypedValue {
	dataType, err := GetType(value)

	if err != nil {
		dataType = TypeAny
	}

	return &valueImpl{dataType: dataType, value: value}
}

// func NewTypedValueWithConversion(dataType Type, value interface{}) (TypedValue, error) {
// 	newVal, err := typeConverter(value, dataType)
// 	if err != nil {
// 		return nil, err
// 	}
// 	return &valueImpl{dataType: dataType, value: newVal}, nil
// }

// NewTypedValue create new TypedValue
func NewTypedValue(dataType Type, value interface{}) TypedValue {
	return &valueImpl{dataType: dataType, value: value}
}

type valueImpl struct {
	dataType Type
	value    interface{}
}

func (v *valueImpl) Type() Type {
	return v.dataType
}

func (v *valueImpl) Value() interface{} {
	return v.value
}

// ToUint64 convert to uint64
func (v *valueImpl) ToUint64() (uint64, error) {
	return 0, nil
}

// ToInt64 convert to int64
func (v *valueImpl) ToInt64() (int64, error) {
	return 0, nil
}
